
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>如何在Java中优雅地处理异常与回调 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>如何在Java中优雅地处理异常与回调 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Java中的异常根据处理方式可以分为哪两大类？请分别举例说明。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Java中的异常分为两类：1. 受检查异常（Checked Exception），是程序员必须处理的异常，例如 `IOException`、`SQLException`。2. 未受检查异常（Unchecked Exception），通常由程序的逻辑错误引起，例如 `NullPointerException`、`ArrayIndexOutOfBoundsException`。</div>
          </div>
          <div class="card-source">来源: 1.2 异常的分类</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在Java的`try-catch-finally`语句块中，`finally`块的主要作用是什么？它在什么情况下总会被执行？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`finally`块通常用于执行清理工作和释放资源。无论`try`块中是否发生异常，`finally`块中的代码都会被执行。</div>
          </div>
          <div class="card-source">来源: 1.3 异常处理的流程</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">当方法中可能产生异常时，文档中提到了哪两种截然不同的处理策略？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档中提到了两种处理策略：1. 异常传递，即使用`throws`关键字将异常抛给上层调用者处理。2. 异常处理，即在方法内部使用`try-catch`块捕获并处理异常。</div>
          </div>
          <div class="card-source">来源: 2.1 异常传递 vs 异常处理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">文档中描述的“回调”是什么？在Java中，实现回调的传统方式是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">回调是一种设计模式，它允许一个函数作为参数传递给另一个函数，在某个操作完成后被调用以进行通知。在Java中，回调通常通过接口或抽象类来实现。</div>
          </div>
          <div class="card-source">来源: 3.1 什么是回调？</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Java 8的Lambda表达式为回调的实现带来了什么好处？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Java 8引入的Lambda表达式使得回调的实现更加简洁。通过Lambda，可以在传递回调时使用更简洁的代码，而无需编写完整的匿名内部类。</div>
          </div>
          <div class="card-source">来源: 3.2.2 使用Lambda表达式简化回调</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Java 8的`CompletableFuture`是如何结合回调与异常处理的？它提供了哪个关键方法来实现这一点？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`CompletableFuture`支持在异步任务完成时进行异常处理。它提供了`handle`方法，该方法允许在异步操作完成时，统一处理正常返回的结果或发生的异常，从而避免阻塞主线程。</div>
          </div>
          <div class="card-source">来源: 4.2 异常处理中的回调增强：CompletableFuture</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">什么是“异常的封装与转换”？为什么要这样做？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“异常的封装与转换”是指将底层的具体异常（如`SQLException`）捕获后，封装并转化为一个更贴合业务的自定义异常（如`DatabaseException`）再抛出。这样做可以隐藏实现细节，并保证上层业务逻辑处理异常时的一致性。</div>
          </div>
          <div class="card-source">来源: 5.1 异常的封装与转换</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">为了提高回调机制的可维护性和灵活性，文档推荐了哪两种设计方法来解耦回调逻辑？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档推荐使用观察者模式或事件驱动架构。这两种方法可以将回调的实现与业务逻辑分离，从而使代码更加灵活和可扩展。</div>
          </div>
          <div class="card-source">来源: 5.2 回调的解耦</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">为什么在复杂的系统中需要定义自定义异常类？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在复杂系统中，定义自定义异常类可以对错误进行更细粒度的分类。这样，在捕获异常时，可以根据具体的异常类型进行不同的、更有针对性的处理。</div>
          </div>
          <div class="card-source">来源: 2.2 定制化异常处理</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
